/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;
import java.util.List;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import pojo.Danhmuc;
import pojo.Sanpham;
import util.HibernateUtil;
/**
 *
 * @author dtth
 */
public class SanPhamDAO {
    
    /**
     * 1. Phương thức này dùng để thêm một đối tượng sản phẩm vào CSDL.
     * @param sp
     * @return 
     */
    public static boolean themSanPham(Sanpham sp) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();
            session.save(sp);
            transaction.commit();
        } catch(HibernateException ex) {
           //Ghi loi vao file Log su dung Log4J
           transaction.rollback();
           throw new HibernateException(ex.toString());
        } finally {
            session.close();
        }
        return true;
    }
    
    
    /**
     * 2. Phương thức này dùng để xóa một đối tượng sản phẩm ra khỏi CSDL.
     * @param sp
     * @return 
     */
    public static boolean xoaSanPham(Sanpham sp) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();
            session.delete(sp);
            transaction.commit();
        } catch(HibernateException ex) {
           //Ghi loi vao file Log su dung Log4J
           transaction.rollback();
           throw new HibernateException(ex.toString());
        } finally {
            session.close();
        }
        return true;
    }
    
    /**
     * 3. Phương thức này dùng để cập nhật thông tin một đối tượng sản phẩm.
     * @param sp
     * @return
     */
    public static boolean capnhatThongTinSanPham(Sanpham sp) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();
            session.update(sp);
            transaction.commit();
        } catch(HibernateException ex) {
           //Ghi loi vao file Log su dung Log4J
           transaction.rollback();
           throw new HibernateException(ex.toString());
        } finally {
            session.close();
        }
        return true;
    }
    
    /**
     * 4. Phương thức này dùng để lấy thông tin 1 đối tượng sản phẩm.
     * @param iMaSanPham
     * @return 
     */
    public static Sanpham layThongTinSanPham(Integer iMaSanPham) {
        Sanpham sp = null;
        Session session = HibernateUtil.getSessionFactory().openSession();
        try {
            sp = (Sanpham) session.get(Sanpham.class, iMaSanPham);
            //Hibernate.initialize(sp.getDanhmuc());
        } catch(HibernateException ex) {
           //Ghi loi vao file Log su dung Log4J

            throw new HibernateException(ex.toString());
        } finally {
            session.close();
        }
        return sp;
    }
    
    /**
     * 5. Phương thức này dùng để lấy danh sách các sản phẩm 
     * @return
     * @throws HibernateException 
     */
    public static List<Sanpham> layDanhSachSanPham() throws HibernateException {
        List<Sanpham> listSanPham = null;
        Session session = HibernateUtil.getSessionFactory().openSession();
        try {
            String hql = "select sp from Sanpham sp";
            Query query = session.createQuery(hql);
            listSanPham = query.list();
            //Hibernate.initialize(query);
        } catch(HibernateException ex) {
            //Ghi loi vao file Log su dung Log4J
            
            throw new HibernateException(ex.toString());
        } finally {
            session.close();
        }
        return listSanPham;
    }
    
    /** duy
     * 6. Phương thức này dùng để tìm kiếm danh sách các sản phẩm 
     * @return
     * @throws HibernateException 
     */
    public static List<Sanpham> timKiemSanPham(String tenSanPham, int maDanhMuc) throws HibernateException {
        List<Sanpham> listSanPham = null;
        Session session = HibernateUtil.getSessionFactory().openSession();
        try {
            String hql = "select sp from Sanpham sp where sp.tensanpham like :tenSanPham";
            Query query = session.createQuery(hql);
            query.setString("tenSanPham", "%" + tenSanPham + "%");
            listSanPham = query.list();
            if(!(listSanPham.size() > 0) || tenSanPham.equalsIgnoreCase("")){
                hql = "select sp from Sanpham sp where sp.danhmuc =:maDanhMuc";
                query = session.createQuery(hql);
                query.setInteger("maDanhMuc", maDanhMuc);
                listSanPham = query.list();
            }
        } catch(HibernateException ex) {
            //Ghi loi vao file Log su dung Log4J
            
            throw new HibernateException(ex.toString());
        } finally {
            session.close();
        }
        return listSanPham;
    }
    
    /** duy
     * 7. Phương thức này dùng để lay danh sách các sản phẩm theo tung danh muc
     * @return
     * @throws HibernateException 
     */
    public static List<Sanpham> layDanhSachSanPham(Danhmuc danhmuc) throws HibernateException {
        List<Sanpham> listSanPham = null;
        Session session = HibernateUtil.getSessionFactory().openSession();
        try {
            String hql = "select sp from Sanpham sp where sp.danhmuc = :madanhmuc";
            Query query = session.createQuery(hql);
            query.setInteger("madanhmuc", danhmuc.getMadanhmuc());
            listSanPham = query.list();
        } catch(HibernateException ex) {
            //Ghi loi vao file Log su dung Log4J
            
            throw new HibernateException(ex.toString());
        } finally {
            session.close();
        }
        return listSanPham;
    }
}
